home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / MNetsrc.hqx / Mac TCP_IP Source v.33 / mac_callbka.c < prev    next >
Text File  |  1989-03-04  |  11KB  |  376 lines

  1. /* PROGRAM mac_callbka.c */
  2. /* This program will read the Callbook Database for AX.25 Sessions */
  3.  
  4. /****************************************************/
  5. /*                  HISTORY                         */
  6. /*                                                  */
  7. /* JAN  9 1989  KGS - original release              */
  8. /* JAN 12 1989  KGS - added raw mode                */
  9. /* FEB  9 1989  DLH - changed to support TCP/IP     */
  10. /* MAR  1 1989  DLH - changed to support AX.25      */
  11. /****************************************************/
  12.  
  13. #include <stdio.h>
  14. #include <ctype.h>
  15. #include "global.h"
  16. #include "config.h"
  17. #ifdef CALLBK
  18. #include "callbook.h"
  19. #include "timer.h"
  20. #include "mbuf.h"
  21. #include "internet.h"
  22. #include "icmp.h"
  23. #include "netuser.h"
  24. #include "ax_mbx.h"
  25.  
  26. extern FILE    *cbklfp;
  27. extern FILE *cbkfp;
  28. extern char *logtime();
  29. static char record [RECORD_LENGTH];
  30. static char log_string[128];
  31. static char out_string[80];
  32. static char msg_out[256];
  33. static long line_number = 0;
  34. static int ftflag = 0;
  35. static long callbook_size = 0;
  36.  
  37. mac_callbka(axp,who)
  38.     struct mbx    *axp;        /* mbx to send on */
  39.     char *who;
  40. {
  41.  
  42.     if (cbkfp == NULLFILE) { /* open database */
  43.         sprintf(out_string,"Unable to process AX.25 Callbook Server request.\r");
  44.         mbx_msg(axp,out_string);
  45.         return;
  46.     }
  47.     if (ftflag)
  48.         goto getcall;
  49.             
  50.     fseek(cbkfp,0L,2);    /* seek to end of file */
  51.     callbook_size = ftell(cbkfp);    /* this is file size */
  52.     ftflag = 1;            /* set the flag for first time initialization */
  53.  
  54. getcall:
  55.     uppercase(who,who);
  56.     binary_search(who, CALLSIGN_START, CALLSIGN_LEN, callbook_size, axp);
  57.     return;
  58. }
  59.  
  60. static
  61. print_log() /* send log output to file */
  62. {
  63.     if(cbklfp == NULLFILE)
  64.         return;            /* return if no log file */
  65.       fprintf (cbklfp, "%s", log_string);
  66. } /* end print_log */
  67.  
  68. static
  69. binary_search(string, start, length, callbook_size, axp)
  70. int  start;
  71. int  length;
  72. char string[RECORD_LENGTH];
  73. long callbook_size;
  74. struct mbx    *axp;        /* tcb to send on */
  75.  
  76. {
  77. int   i           = 0;
  78. long  low         = 0;
  79. long  middle      = 0;
  80. long  high        = 0;
  81. int   modified    = 0;
  82. char callsign_mod[CALLSIGN_LEN];
  83. static char spaces[] = "        ";
  84.  
  85.   for (i = 0; i < strlen(string); i++) { /* mod callsign to match database */
  86.     if (isdigit (string[i])) {
  87.       strcpy (callsign_mod, (string + i));
  88.       strncat (callsign_mod, spaces, length - strlen(string));
  89.       strncat (callsign_mod, string, i);
  90.       ++modified;
  91.     }
  92.   }
  93.   if (!modified) {
  94.     strcpy(callsign_mod,string); /* special case with no numbers */
  95.   }
  96.   high = callbook_size / RECORD_LENGTH; /* how many records in database */
  97.   do {
  98.     middle = (low + high) / 2;
  99.     fseek (cbkfp, (middle * RECORD_LENGTH), 0);
  100.     fgets (record,RECORD_LENGTH,cbkfp);
  101.     ++line_number;
  102.     if (strncmp(callsign_mod, (record + start), CALLSIGN_LEN) < 0) {
  103.       high = middle - 1;
  104.     }
  105.     else {
  106.       if (strncmp(callsign_mod, (record + start), CALLSIGN_LEN) > 0) {
  107.         low = middle + 1;
  108.       }
  109.     }
  110.   }
  111.   while ((strncmp(callsign_mod, (record + start), CALLSIGN_LEN) != 0) && (low <= high));
  112.   if (low <= high) {
  113.       sprintf(log_string,"[%s] AX.25 Callbook request by %s for %s.\n",
  114.                   logtime(),axp->name,string);
  115.     print_log();
  116.     format(axp);
  117.   }
  118.   else {
  119.       sprintf(log_string,"[%s] AX.25 Callbook request by %s for %s not completed.\n",
  120.                   logtime(),axp->name,string);
  121.     print_log();
  122.     sprintf(out_string,"Callbook record NOT found for ->%s<-.\r",string);
  123.     mbx_msg(axp,out_string);
  124.   }
  125. } /* end binary_search */
  126.  
  127. static
  128. uppercase(to, from)
  129. char *to;
  130. char *from;
  131.  
  132. {  /* copys a lower case string to uppercase */
  133.    while (strncmp (from, "\0", 1) != 0) {
  134.     if (islower(*from)) { /* if lower case, copy as uppercase */
  135.       *to = toupper(*from);
  136.     }
  137.     else {
  138.       *to = *from; /* already uppercase, copy as is */
  139.     }
  140.     if (strncmp (to, "_", 1) == 0) { /* convert underscore to space */
  141.       strncpy (to, " ", 1);
  142.     }
  143.     ++to;
  144.     ++from;
  145.   }
  146.   *to = *from; /* copy \0 at end of string */
  147. } /* end uppercase */
  148.  
  149. static
  150. format(axp)
  151.     struct mbx    *axp;        /* mbx to send on */
  152. {
  153. char string[RECORD_LENGTH];
  154. char mod_string[RECORD_LENGTH];
  155. static char eos[] = "\0"; /* end of string char */
  156. char *string_end,*zip;
  157.  
  158.     sprintf(msg_out,"\r"); /* insure we start on a new line */
  159.     strncpy (string, (record + FIRST_NAME_START), FIRST_NAME_LEN);
  160.     strcpy ((string + FIRST_NAME_LEN), eos);
  161.     rm_whitespace(string);
  162.     sprintf(out_string,"Name:              %.11s",string);
  163.     strcat(msg_out,out_string);
  164.     strncpy (string, (record + MIDDLE_INIT_START), MIDDLE_INIT_LEN);
  165.     strcpy ((string + MIDDLE_INIT_LEN), eos);
  166.     rm_whitespace(string);
  167.     sprintf(out_string," %.1s. ",string);
  168.     strcat(msg_out,out_string);
  169.     strncpy (string, (record + LAST_NAME_START), LAST_NAME_LEN);
  170.     strcpy ((string + LAST_NAME_LEN), eos);
  171.     rm_whitespace(string);
  172.     sprintf(out_string,"%.20s ",string);
  173.     strcat(msg_out,out_string);
  174.     strncpy (string, (record + LAST_NAME_SUFF_START), LAST_NAME_SUFF_LEN);
  175.     strcpy ((string + LAST_NAME_SUFF_LEN), eos);
  176.     rm_whitespace(string);
  177.     sprintf(out_string,"%s\r",string);
  178.     strcat(msg_out,out_string);
  179.     mbx_msg(axp,msg_out);
  180.  
  181.     strncpy (string, (record + CALLSIGN_START), CALLSIGN_LEN);
  182.     strcpy ((string + CALLSIGN_LEN), eos);
  183.     string_end = (string + strlen (string)) - 1; /* fix the callsign so it */
  184.     while (strncmp (string_end, " ", 1) != 0) {  /* is readable */
  185.       --string_end;
  186.     }
  187.     strcpy (mod_string, (string_end + 1));
  188.     strncat (mod_string, string, ((strlen (string)) -(strlen (string_end))));
  189.     rm_whitespace(mod_string);
  190.     sprintf(msg_out,"License:           %.8s ",mod_string);
  191.     strncpy (string, (record + LICENSE_CLASS_START), LICENSE_CLASS_LEN);
  192.     strcpy ((string + LICENSE_CLASS_LEN), eos);
  193.     rm_whitespace(string);
  194.     sprintf(out_string,"           License Class: %s\r",string);
  195.     strcat(msg_out,out_string);
  196.     mbx_msg(axp,msg_out);
  197.  
  198.     strncpy (string, (record + MAIL_ADRS_START), MAIL_ADRS_LEN);
  199.     strcpy ((string + MAIL_ADRS_LEN), eos);
  200.     rm_whitespace(string);
  201.     sprintf(msg_out,"Mail address:      %s, ",string);
  202.     strncpy (string, (record + MAIL_ADRS_CTY_START), MAIL_ADRS_CTY_LEN);
  203.     strcpy ((string + MAIL_ADRS_CTY_LEN), eos);
  204.     rm_whitespace(string);
  205.     sprintf(out_string,"%s, ",string);
  206.     strcat(msg_out,out_string);
  207.     strncpy (string, (record + MAIL_ADRS_ST_START), MAIL_ADRS_ST_LEN);
  208.     strcpy ((string + MAIL_ADRS_ST_LEN), eos);
  209.     rm_whitespace(string);
  210.     sprintf(out_string,"%s ",string);
  211.     strcat(msg_out,out_string);
  212.     strncpy (string, (record + MAIL_ADRS_ZIP_START), MAIL_ADRS_ZIP_LEN);
  213.     strcpy ((string + MAIL_ADRS_ZIP_LEN), eos);
  214.     rm_whitespace(string);
  215.     sprintf(out_string,"%.5s-%.4s\r",string,
  216.             zip = "0000");
  217.     strcat(msg_out,out_string);
  218.     mbx_msg(axp,msg_out);
  219.  
  220.     strncpy (string, (record + STA_ADRS_START), STA_ADRS_LEN);
  221.     strcpy ((string + STA_ADRS_LEN), eos);
  222.     rm_whitespace(string);
  223.     sprintf(msg_out,"Station address:   %s, ",string);
  224.     strncpy (string, (record + STA_ADRS_CTY_START), STA_ADRS_CTY_LEN);
  225.     strcpy ((string + STA_ADRS_CTY_LEN), eos);
  226.     rm_whitespace(string);
  227.     sprintf(out_string,"%s, ",string);
  228.     strcat(msg_out,out_string);
  229.     strncpy (string, (record + STA_ADRS_ST_START), STA_ADRS_ST_LEN);
  230.     strcpy ((string + STA_ADRS_ST_LEN), eos);
  231.     rm_whitespace(string);
  232.     sprintf(out_string,"%s\r",string);
  233.     strcat(msg_out,out_string);
  234.     mbx_msg(axp,msg_out);
  235.  
  236.     strncpy (string, (record + EFFECTIVE_START), EFFECTIVE_LEN);
  237.     strcpy ((string + EFFECTIVE_LEN), eos);
  238.     rm_whitespace(string);
  239.     date (string);
  240.     sprintf(msg_out,"Effective date:    %s ",string);
  241.     strncpy (string, (record + EXPIRATION_START), EXPIRATION_LEN);
  242.     strcpy ((string + EXPIRATION_LEN), eos);
  243.     rm_whitespace(string);
  244.     date (string);
  245.     sprintf(out_string," Expiration date: %s\r",string);
  246.     strcat(msg_out,out_string);
  247.     mbx_msg(axp,msg_out);
  248.  
  249.     strncpy (string, (record + PREVIOUS_CALLSIGN_START), PREVIOUS_CALLSIGN_LEN);
  250.     strcpy ((string + PREVIOUS_CALLSIGN_LEN), eos);
  251.     rm_whitespace(string);
  252.     sprintf(msg_out,"Previous Callsign: %.8s",string);
  253.     strncpy (string, (record + PREVIOUS_CLASS_START), PREVIOUS_CLASS_LEN);
  254.     strcpy ((string + PREVIOUS_CLASS_LEN), eos);
  255.     rm_whitespace(string);
  256.     sprintf(out_string,"        Previous Class: %s\r",string);
  257.     strcat(msg_out,out_string);
  258.     mbx_msg(axp,msg_out);
  259.  
  260.     strncpy (string, (record + BIRTH_START), BIRTH_LEN);
  261.     strcpy ((string + BIRTH_LEN), eos);
  262.     rm_whitespace(string);
  263.     date (string);
  264.     sprintf(msg_out,"Birthdate:         %.13s ",string);
  265.     strncpy (string, (record + PROCESS_START), PROCESS_LEN);
  266.     strcpy ((string + PROCESS_LEN), eos);
  267.     rm_whitespace(string);
  268.     date (string);
  269.     sprintf(out_string,"    Process date: %s\r\r",string);
  270.     strcat(msg_out,out_string);
  271.     mbx_msg(axp,msg_out);
  272. }
  273.  
  274. static
  275. rm_whitespace(string)
  276. char *string;
  277. {
  278. int i = 0;
  279. static char eos[] = "\0"; /* end of string char */
  280. char *string_end;
  281.  
  282.   string_end = (string + strlen (string)) - 1;
  283.   while (strncmp (string_end, " ", 1) == 0) {
  284.     --string_end;
  285.   }
  286.   strcpy ((string_end + 1), eos);
  287. }
  288.  
  289. static
  290. date(string)
  291. char *string;
  292. {
  293. int day = 0;
  294. int month = 0;
  295. int year = 0;
  296. int leap = 0;
  297. char temp_string[RECORD_LENGTH];
  298. static char eos[] = "\0";
  299. static int days_per_month [2][13] = {
  300.     {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  301.     {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
  302.     };
  303.  
  304.   day = atoi(string + 2); /* get the day of year */
  305.   strcpy ((string + 2), eos);
  306.   year = atoi(string); /* get the year */
  307.   if (year < THISYEAR + 10) {
  308.     year += 1900;
  309.   }
  310.   else {
  311.     year += 1800;
  312.   }
  313.   leap = year%4 == 0 && year%100 != 0 || year%400 == 0;
  314.   for (month = 1; day > days_per_month [leap][month]; month++) {
  315.     day -= days_per_month [leap][month];
  316.   }
  317.  
  318.   switch (month) {
  319.     case 1 :
  320.       strcpy(string, "Jan.");
  321.       break;
  322.  
  323.     case 2 :
  324.       strcpy(string, "Feb.");
  325.       break;
  326.  
  327.     case 3 :
  328.       strcpy(string, "Mar.");
  329.       break;
  330.  
  331.     case 4 :
  332.       strcpy(string, "Apr.");
  333.       break;
  334.  
  335.     case 5 :
  336.       strcpy(string, "May");
  337.       break;
  338.  
  339.     case 6 :
  340.       strcpy(string, "Jun.");
  341.       break;
  342.  
  343.     case 7 :
  344.       strcpy(string, "Jul.");
  345.       break;
  346.  
  347.     case 8 :
  348.       strcpy(string, "Aug.");
  349.       break;
  350.  
  351.     case 9 :
  352.       strcpy(string, "Sep.");
  353.       break;
  354.  
  355.     case 10 :
  356.       strcpy(string, "Oct.");
  357.       break;
  358.  
  359.     case 11 :
  360.       strcpy(string, "Nov.");
  361.       break;
  362.  
  363.     case 12 :
  364.       strcpy(string, "Dec.");
  365.       break;
  366.  
  367.     default :
  368.       sprintf (log_string,"Invalid month ->%d<- .\n", month);
  369.       print_log ();
  370.       break;
  371.   }
  372.   sprintf (temp_string,"%s %d, %d", string, day, year);
  373.   strcpy (string, temp_string);
  374. }
  375. #endif
  376.